﻿-- Function: fun_documento_upd(character, bigint, character, character varying, character varying, character, character, integer, character varying, character varying, character, boolean, character, character, character varying, character varying, character varying, character varying)

-- DROP FUNCTION fun_documento_upd(character, bigint, character, character varying, character varying, character, character, integer, character varying, character varying, character, boolean, character, character, character varying, character varying, character varying, character varying);

CREATE OR REPLACE FUNCTION fun_documento_upd(IN ptipo_docu character, IN pnumero_docu bigint, IN panhio_docu character, IN pasunto character varying, IN pcuerpo character varying, IN pdestinatario character, IN preferencia character, IN ptiempo_respuesta integer, IN pcopia character varying, IN pquienfirma character varying, IN pcabecera character, IN pproyectado boolean, IN pusuario character, IN p_cod_empresa character, IN p_codigo_directiva_pertenece character varying, IN p_persona_emitente character varying, IN p_tipo_proyecto character varying, IN p_documentos_proyectos character varying, OUT ban character varying)
  RETURNS character varying AS
$BODY$
   DECLARE
      longitud integer;
      respuesta character varying;
      v_anhio character(4);
      v_numero_docu integer;      
      v_nombre_anhio character varying;
      v_cabecera character varying;
      v_tipo_docu_temp character(3);
      v_numero_docu_temp integer;
      v_anhio_docu_temp character varying;
      v_cabecera_docu_temp character varying;
      v_profesion character varying;
      v_quien character varying;
      v_quedice_quien character varying;
      v_dni_codigo character varying;
      v_tipo_dni_codigo integer;
      v_correos_copia character varying;
      v_cabecera_complemento character varying;
      v_codigo_area character varying;
      v_nombre_area character varying;
      v_codigo_directiva character varying;

      v_usuario_codigo character(8);
      v_usuario_nombres character varying;
      v_usuario_cargo character varying;
      v_usuario_area character(8);
      	
      v_firma_dni character(8);
      v_firma_nombres character varying;
      v_firma_cargo character varying;
      v_firma_codigo_directiva character varying;
      
   BEGIN
      ban := 'ok';
      v_numero_docu = pnumero_docu;
      v_anhio = panhio_docu;
       --- obtenemos los datos del usuario que genero el documento
      v_usuario_codigo = trim(substring(pusuario,1,position('|' in pusuario)-1));
      pusuario = substring(pusuario,position('|' in pusuario)+1,char_length(pusuario));
      v_usuario_nombres = trim(substring(pusuario,1,position('|' in pusuario)-1));
      pusuario = substring(pusuario,position('|' in pusuario)+1,char_length(pusuario));
      v_usuario_cargo = trim(substring(pusuario,1,position('|' in pusuario)-1));
      pusuario = substring(pusuario,position('|' in pusuario)+1,char_length(pusuario));
      v_usuario_area = trim(substring(pusuario,1,position('|' in pusuario)-1));
      --- obtenemos lo referente a quien firma 
      v_firma_dni  = substring(pquienfirma,1,position('|' in pquienfirma)-1);   
      pquienfirma = substring(pquienfirma,position('|' in pquienfirma)+1,char_length(pquienfirma));
      v_firma_nombres = substring(pquienfirma,1,position('|' in pquienfirma)-1);  
      pquienfirma = substring(pquienfirma,position('|' in pquienfirma)+1,char_length(pquienfirma));
      v_firma_cargo = substring(pquienfirma,1,position('|' in pquienfirma)-1);    
      pquienfirma = substring(pquienfirma,position('|' in pquienfirma)+1,char_length(pquienfirma));
      v_firma_codigo_directiva = substring(pquienfirma,1,position('|' in pquienfirma)-1);   
      
      --- actualizamos las copias       
      delete from tb_documento_copia where tipo_documento_docu_copi = ptipo_docu and numero_documento_docu_copi = pnumero_docu and 
      anhio_documento_docu_copi = panhio_docu;
      v_correos_copia = '';
      
      WHILE 1 < char_length(pcopia) LOOP
         
         v_codigo_area = trim(substring(pcopia,1,position('|' in pcopia)-1));
	 pcopia = substring(pcopia,position('|' in pcopia)+1,char_length(pcopia));
	 v_nombre_area = trim(substring(pcopia,1,position('|' in pcopia)-1));
	 pcopia = substring(pcopia,position('|' in pcopia)+1,char_length(pcopia));
	 v_codigo_directiva = trim(substring(pcopia,1,position('|' in pcopia)-1));
	 pcopia = substring(pcopia,position('|' in pcopia)+1,char_length(pcopia));
	 v_correos_copia = v_correos_copia||trim(v_codigo_directiva)||',';
	 
	 INSERT INTO tb_documento_copia(tipo_documento_docu_copi, numero_documento_docu_copi, anhio_documento_docu_copi, 
	 codigo_dni_docu_copi, nombres_docu_copi, correo_docu_copi)  VALUES (ptipo_docu, pnumero_docu ,panhio_docu,trim( v_codigo_area) 
	 , trim(v_nombre_area), trim(v_codigo_directiva));
      end loop;
      --- construimos la cabecera
      if ptipo_docu = '999' then 
         v_cabecera = upper(trim(pcabecera));         
      else	 
	 IF pproyectado THEN
		v_cabecera_complemento = '';
		v_cabecera_docu_temp = pcabecera;
		v_codigo_area = trim(substring(v_cabecera_docu_temp,1,position('|' in v_cabecera_docu_temp)-1));
		v_cabecera_docu_temp = substring(v_cabecera_docu_temp,position('|' in pcabecera)+1,char_length(v_cabecera_docu_temp));
		v_nombre_area = trim(substring(v_cabecera_docu_temp,1,position('|' in v_cabecera_docu_temp)-1));
		v_cabecera_docu_temp = substring(v_cabecera_docu_temp,position('|' in v_cabecera_docu_temp)+1,char_length(v_cabecera_docu_temp));
		v_codigo_directiva = trim(substring(v_cabecera_docu_temp,1,position('|' in v_cabecera_docu_temp)-1));
		v_cabecera_docu_temp = substring(v_cabecera_docu_temp,position('|' in v_cabecera_docu_temp)+1,char_length(v_cabecera_docu_temp));
		v_cabecera_complemento = trim(v_codigo_directiva)||'.'||TRIM(v_firma_codigo_directiva)||'.';
		v_cabecera_docu_temp = '';
	 ELSE
		v_cabecera_complemento = TRIM(v_firma_codigo_directiva)||'.';
	 END IF;

	---Actualiza Los Vistos
		ban := fun_documento_visto_upd(ptipo_docu,pnumero_docu,panhio_docu,pcabecera);
	 
	 v_cabecera = (select descripcion_docu_tipo from tb_documento_tipo where codigo_docu_tipo = ptipo_docu);
	 ---v_cabecera = trim(v_cabecera)||' N° '||LPAD(trim(to_char(pnumero_docu,'9999999999')),4,'0')||'-'||panhio_docu||'-EPS GRAU S.A./'||v_cabecera_complemento; 
	 IF pproyectado THEN 
	  v_cabecera = trim(v_cabecera)||' N° -'||panhio_docu||'-EPS GRAU S.A./'||v_cabecera_complemento; 
	 ELSE
	  v_cabecera = trim(v_cabecera)||' N° '||LPAD(trim(to_char(pnumero_docu,'9999999999')),4,'0')||'-'||panhio_docu||'-EPS GRAU S.A./'||v_cabecera_complemento; 	
	 END IF;
      end if;
      --- actualizamos el docuemnto en si 
      update tb_documento set asunto_docu = upper(pasunto),cuerpo_docu = pcuerpo,dias_respuesta_docu = ptiempo_respuesta,
      copia_docu = trim(v_correos_copia),firma_dni_docu = v_firma_dni,firma_nombres_docu=trim(v_firma_nombres),
      firma_cargo_docu = trim(v_firma_cargo), firma_codigo_directiva = TRIM(v_firma_codigo_directiva) ,
      generar_flash_docu = '1', cabecera_docu = v_cabecera
      where tb_documento.tipo_docu = ptipo_docu and tb_documento.numero_docu = pnumero_docu and tb_documento.anhio_docu = panhio_docu;
      --- actualizamos los destinatarios
      IF ptipo_docu = '001' then 
         WHILE 1 < char_length(pdestinatario) LOOP
            v_dni_codigo = substring(pdestinatario,1,position('|' in pdestinatario)-1);
            pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));
            v_profesion = substring(pdestinatario,1,position('|' in pdestinatario)-1);
            pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));
         
	    UPDATE tb_comision SET tipo_documento_comi=ptipo_docu, numero_documento_comi=v_numero_docu, anhio_documento_comi=v_anhio
            WHERE numero_comi=CAST(v_dni_codigo as integer) and anhio_comi= v_profesion;
	 end loop;	
      else
         delete from tb_documento_destinatario where tipo_documento_docu_dest=ptipo_docu and numero_documento_docu_dest = pnumero_docu
         and anhio_documento_docu_dest = panhio_docu;
         --
         WHILE 1 < char_length(pdestinatario) LOOP
            v_dni_codigo = substring(pdestinatario,1,position('|' in pdestinatario)-1);
            pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));
            v_profesion = substring(pdestinatario,1,position('|' in pdestinatario)-1);
            pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));
            v_quien = substring(pdestinatario,1,position('|' in pdestinatario)-1);
            pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));
            v_quedice_quien = substring(pdestinatario,1,position('|' in pdestinatario)-1);
            pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));                   
            --- para la bandeja de usario             
            insert into tb_documento_destinatario(tipo_documento_docu_dest,numero_documento_docu_dest,anhio_documento_docu_dest,profesion_docu_dest,
            aquien_docu_dest,datos_aquien_docu_dest,codigo_dni_docu_dest) 
           values(ptipo_docu,pnumero_docu,panhio_docu,v_profesion,v_quien,v_quedice_quien,v_dni_codigo);
         END LOOP;   
      END IF;             
      --- actualizamos las referencias 
      delete from tb_documento_referencia where tipo_documento_docu_refe = ptipo_docu and 
       numero_documento_docu_refe = pnumero_docu and  anhio_documento_docu_refe = panhio_docu ;   
      longitud = 0;
      WHILE 1 < char_length(preferencia) LOOP    
         longitud = longitud +1;
         v_tipo_docu_temp = substring(preferencia,1,position('|' in preferencia)-1);
         preferencia = substring(preferencia,position('|' in preferencia)+1,char_length(preferencia));         
         v_numero_docu_temp = to_number ( substring(preferencia,1,position('|' in preferencia)-1),'9999999');
         preferencia = substring(preferencia,position('|' in preferencia)+1,char_length(preferencia));
         v_anhio_docu_temp = TRIM(substring(preferencia,1,position('|' in preferencia)-1));
         preferencia = substring(preferencia,position('|' in preferencia)+1,char_length(preferencia));
         
         IF v_tipo_docu_temp = '998' AND v_numero_docu_temp=0 THEN

		-- En este caso el Nombre de la referencia se almacena en la variable 'v_anhio_docu_temp' Debido a que es un documento
		-- que no esta en el sistema
		---
		INSERT INTO tb_documento_referencia(tipo_documento_docu_refe,numero_documento_docu_refe,anhio_documento_docu_refe,
		tipo_documento_referencia_docu_refe,numero_documento_referencia_docu_refe,cabecera_documento_referencia_docu_refe,
		anhio_documento_referencia_docu_refe) 
		VALUES(ptipo_docu,v_numero_docu,v_anhio,v_tipo_docu_temp,longitud,
			v_anhio_docu_temp,CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS CHARACTER VARYING));   
		---
	 ELSE
		
		v_cabecera_docu_temp = TRIM((SELECT cabecera_docu FROM tb_documento 
						WHERE tipo_docu=v_tipo_docu_temp 
						AND numero_docu=v_numero_docu_temp 
						AND anhio_docu=v_anhio_docu_temp));
		v_cabecera_docu_temp = TRIM(v_cabecera_docu_temp);		
		---
		INSERT INTO tb_documento_referencia(tipo_documento_docu_refe,numero_documento_docu_refe,anhio_documento_docu_refe,
		tipo_documento_referencia_docu_refe,numero_documento_referencia_docu_refe,cabecera_documento_referencia_docu_refe,
		anhio_documento_referencia_docu_refe) 
		VALUES(ptipo_docu,v_numero_docu,v_anhio,v_tipo_docu_temp,v_numero_docu_temp,v_cabecera_docu_temp,v_anhio_docu_temp);   
		---
	 END IF;	
	 
      END LOOP;     

      IF EXISTS(SELECT * FROM tb_documento 
			WHERE tb_documento.tipo_docu = ptipo_docu AND 
			      tb_documento.numero_docu = pnumero_docu AND 
			      tb_documento.anhio_docu = panhio_docu AND
			      tb_documento.fecha_cierre_docu IS NOT NULL) THEN
		ban := fun_documento_historia_ins( ptipo_docu,pnumero_docu,panhio_docu,v_usuario_codigo||'|'||v_usuario_nombres||' ('|| v_usuario_cargo||')|'
                       ,'||','|Modifico del Documento|');
      ELSE
	     IF TRIM(v_usuario_codigo) = TRIM(v_usuario_area) THEN
		  --- Agregamos al historial
		 ban := fun_documento_historia_ins( ptipo_docu,pnumero_docu,panhio_docu,v_usuario_codigo||'|'||v_usuario_nombres||' ('|| v_usuario_cargo||')|'
					       ,v_usuario_codigo||'|'||v_usuario_nombres||' ('|| v_usuario_cargo||')|','|Modifico del Documento|');
	     ELSE
		 --- enviamos a la bandeja que ya fue modificado
		 ---MODIFICADO MX
		 UPDATE tb_documento SET usuario_codigo_docu = TRIM(v_usuario_area) 
		 WHERE tipo_docu = ptipo_docu AND numero_docu = v_numero_docu AND anhio_docu = v_anhio;
		 ---MODIFICADO MX, END
				
		 insert into tb_bandeja_usuario
		 (dni_unidad_band_usua,codigo_motivo_band_usua,remitente_dni_unidad_band_usua,
		 remitente_nombres_band_usua,remitente_cargo_band_usua,fecha_band_usua,hora_band_usua,estado_band_usua,observacion_band_usua,
		 tipo_documento_band_usua,numero_documento_band_usua,anhio_documento_band_usua)
		 VALUES(trim(v_usuario_area),'005',trim(v_usuario_codigo),TRIM(v_usuario_nombres),TRIM(v_usuario_cargo),current_date,current_time,'P',
		 TRIM('SE HA MODIFICADO EL DOCUMENTO POR EL USUARIO:'||TRIM(v_usuario_nombres)||'('||TRIM(v_usuario_cargo)||')'),
		 ptipo_docu,v_numero_docu,v_anhio);
		 
		 ban := fun_documento_historia_ins( ptipo_docu,pnumero_docu,panhio_docu,v_usuario_codigo||'|'||v_usuario_nombres||' ('|| v_usuario_cargo||')|'
					       ,v_usuario_area||'|JEFE QUE SOLICITO MODIFICACION|','|Modificacion del Documento y Envio|');
	    END IF;
      END IF; 	

      
      
      ban := 'O'||'Se actualizo Documento';
      ---
      EXCEPTION
      WHEN foreign_key_violation THEN
		RAISE EXCEPTION 'error al actualizar el metrado';
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fun_documento_upd(character, bigint, character, character varying, character varying, character, character, integer, character varying, character varying, character, boolean, character, character, character varying, character varying, character varying, character varying) OWNER TO postgres;
